package com.star.uc.contract.enums.iplimit;

import com.star.common.core.context.SpringContext;
import com.star.common.core.contract.enums.ResultCodeEnum;
import com.star.common.core.contract.exception.ServiceException;
import com.star.common.core.utils.BizAssert;
import com.star.uc.contract.enums.UserErrorEnum;
import com.star.uc.contract.exception.IpLimitException;
import com.star.uc.infras.properties.LimitProperties;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;

/**
 * ip限制数量类型枚举
 *
 * @author zhouhengzhe
 */
@Getter
@AllArgsConstructor
public enum IpLimitTypeEnum implements IpLimitValidate {

    DEFAULT("DEFAULT", "默认不处理") {
        /**
         * ip限制校验
         *
         * @param ip         ip
         * @param value      手机号/邮件
         * @param tenantId   应用ID
         * @param clientType 客户端类型
         */
        @Override
        public void validate(String ip, String value, String tenantId, String clientType) {
            //默认不处理
        }
    },
    THROW_ERROR("THROW_ERROR", "抛异常") {
        /**
         * ip限制校验
         *
         * @param ip         ip
         * @param value      手机号/邮件
         * @param tenantId   应用ID
         * @param clientType 客户端类型
         */
        @Override
        public void validate(String ip, String value, String tenantId, String clientType) {
            //报错
            throw new IpLimitException(UserErrorEnum.IP_LIMIT);
        }
    },
    REDIS("REDIS","redis实现人机验证"){
        /**
         * ip限制校验
         *
         * @param ip         ip
         * @param value      手机号/邮件
         * @param tenantId   应用ID
         * @param clientType 客户端类型
         */
        @Override
        public void validate(String ip, String value, String tenantId, String clientType) {

        }
    },
    GEETEST("GEETEST", "极客校验") {
        /**
         * ip限制校验
         *
         * @param ip         ip
         * @param value      手机号/邮件
         * @param tenantId   应用ID
         * @param clientType 客户端类型
         */
        @Override
        public void validate(String ip, String value, String tenantId, String clientType) {
            //todo 极客校验暂时留着 ，人机校验
            LimitProperties.IpConfig.GeetestProperties geetest = SpringContext.getBean(LimitProperties.class).getIp().getGeetest();
            BizAssert.isFalseError(StringUtils.isBlank(geetest.getGeetestId()) || StringUtils.isBlank(geetest.getGeetestKey()), UserErrorEnum.GEETEST_ID_KEY_NULL);
                //todo 极客校验
        }
    },

    ALIYUN("ALIYUN", "阿里云校验") {
        /**
         * ip限制校验
         *
         * @param ip         ip
         * @param value      手机号/邮件
         * @param tenantId   应用ID
         * @param clientType 客户端类型
         */
        @Override
        public void validate(String ip, String value, String tenantId, String clientType) {
            //todo 阿里云人机校验
        }
    };
    private final String code;
    private final String desc;


    /**
     * 通过code获取限制枚举
     *
     * @param code code
     * @return 限制枚举
     */
    public static IpLimitTypeEnum getByCode(String code) {
        for (IpLimitTypeEnum value : IpLimitTypeEnum.values()) {
            if (value.getCode().equals(code)) {
                return value;
            }
        }
       throw new ServiceException(ResultCodeEnum.METHOD_NOT_ALLOWED);
    }


}
